/**
 * 
 * 一些3d的简单效果做
*/
package kgame5.k3d.util3d {
import gs.TweenGroup;
import gs.TweenLite;
import gs.easing.Bounce;

import kgame5.k3d.core.obj3d.node3d.Node3D;
import kgame5.k3d.core.obj3d.node3d.group3d.World3D;
import kgame5.kmath.MathDG;

public class Effect3D{
	
	//被炸歪,坦克大战用的.start=false表示放置会原位置
	public static function Askew(md:Node3D,start:Boolean=true,factor:Number=1):void{
		//炮塔歪一下
		if(start){
			md.rotY+=MathDG.random(-30,30)*factor;
			md.rotX+=MathDG.random(-30,30)*factor;
			md.y=8*factor;
		}else{
			md.rotY=0;
			md.rotX=0;
			md.y=0;
		}
	}
	
	//像果冻一样动作，先拉伸，后扁平
	public static function Jelly(md:Node3D,durMS:Number=1.5):void{
		if(md.extraObj!=null){
			var myGroup2:TweenGroup = md.extraObj as TweenGroup;
			if(myGroup2){
				myGroup2.clear();//tweenGroup.clear();
			}
		}
		md.scale.fill(1, 1, 1);
		
		var secDelay:Number=0.05;
		var secA:Number=0.5;
		//var secB:Number=1.5;
		
		//TweenGroup
	 	//var t1:TweenLite=new TweenLite(md.scale, secA, {y:1.5,x:0.8,z:0.8,ease:Bounce.easeIn,delay:secDelay});
	 	md.scale.fill(0.6, 2, 0.6);
	 	//var t2:TweenLite=new TweenLite(md.scale,0.1,{y:2,x:0.6,z:0.6,ease:Linear.easeOut});
	 	var t3:TweenLite=new TweenLite(md.scale, durMS, {x:1,y:1,z:1,ease:Bounce.easeOut});
	 
		var myGroup:TweenGroup = new TweenGroup([t3]);
		myGroup.align = TweenGroup.ALIGN_SEQUENCE;
	
		md.extraObj=myGroup;//保持引用防止被垃圾回收
	}
	
	//环状运动,注意模型生成的时候是朝向z的负轴的
	public static function PlaceInRing(md:Node3D,CX:Number,CZ:Number,ringRadius:Number,ringAngle:Number){
		var rad:Number=MathDG.DTR*ringAngle;
		var x:Number=ringRadius*Math.sin(rad)+CX;
		var z:Number=ringRadius*Math.cos(rad)+CZ;
		
		md.x=x;
		md.z=z;
		
		md.rotY=-180+ringAngle;//模型生成的时候是朝向z的负轴的,所以用180来加
	} 
	//发射幻影
	public static function EmitPhantom(world:World3D,linkName:String,
		x:Number,y:Number,z:Number){
	
		//
//		var md:Model3D=ParsM.Emit(
//			linkName,
//			
//			x,y,z,
//			0,0,0,
//			0,0,0,
//			
//			0,0,
//			
//			1,-0.05,
//			
//			1,-0.1,
//			
//			Math.floor(100/10)
//		);
//		world.addChild(md);
		
	}
	//环状运动,注意模型生成的时候是朝向z的负轴的
	public static function PlaceInSphere(md:Node3D,Radius:Number,angleXOZ:Number,angleXOY:Number,CX:Number=0,CY:Number=0,CZ:Number=0){
		var radA:Number=MathDG.DTR*angleXOZ;//0~360
		var radB:Number=MathDG.DTR*angleXOY;//90~0~-90
		
		var RadiusXOZ:Number=Radius*Math.cos(radB);
		var x:Number=RadiusXOZ*Math.sin(radA)+CX;
		var z:Number=RadiusXOZ*Math.cos(radA)+CZ;
		var y:Number=Radius*Math.sin(radB);
		
		md.x=x;
		md.y=y;
		md.z=z;
		
		
		
		md.rotY=angleXOZ;//模型生成的时候是朝向z的负轴的,所以用180来加
	} 
	/////////////////////
	/*
	function aa1(){
	for(var r=0;r<pp+1;r++){
		var angelB:Number=90/pp*r;
		var cc:int=maxCard*Math.cos(MathDG.DTR*angelB);//cosB实际上是本环和赤道的比例
		if(cc<1){
			trace(cc);
			cc=1;
		}
		var hspace:Number=360/cc;
		for(var c=0;c<cc;c++){
			var angelA:Number=c*hspace;
			addBall(angelA,angelB,400);
		}
	}
}
function aa2(){
	for(var r=1;r<pp+1;r++){
		var angelB:Number=-90/pp*r;
		var cc:int=maxCard*Math.cos(MathDG.DTR*angelB);//cosB实际上是本环和赤道的比例
		if(cc<1){
			trace("aa2",cc);
			cc=1;
		}
		var hspace:Number=360/cc;
		for(var c=0;c<cc;c++){
			var angelA:Number=c*hspace;
			addBall(angelA,angelB,400);
		}
	}
}
//*/
	/*
	//做爆炸的发射
	public static function StartBlast(world:World,linkName:String,
		countMin:Number,countMax:Number,//最大数量
		lifeMin:Number,lifeMax:Number,
		initX:Number,initY:Number,initZ:Number,//初始位置
		initSpeedMin:Number,initSpeedMax:Number,//初始速度
		accMin:Number,accMax:Number//加速度
		){
		T.p("Emit_BlastSparks");
		var count:Number=MathDG.random(countMin,countMax);
		for(var i=0;i<count;i++){
			//life
			var life:Number=MathDG.random(lifeMin,lifeMax);
			
			//速度和加速度
			var initSpeed:Number=MathDG.random(initSpeedMin,initSpeedMax);
			var acc:Number=MathDG.random(accMin,accMax);
			//两个角度
			var radA:Number=MathDG.random(0,360)*MathDG.DTR;//xoz平面内的角度
			var radB:Number=MathDG.random(0,90)*MathDG.DTR;//
			
			var vy:Number=Math.sin(radB)*initSpeed;
			var v_xoz:Number=Math.cos(radB)*initSpeed;
			var vx:Number=v_xoz*Math.sin(radA);
			var vz:Number=v_xoz*Math.cos(radA);
			
			var ay:Number=Math.sin(radB)*acc;
			var a_xoz:Number=Math.cos(radB)*acc;
			var ax:Number=a_xoz*Math.sin(radA);
			var az:Number=a_xoz*Math.cos(radA);
			
			//
			var rotation:Number=MathDG.random(0,360);
			var rotationSpeed:Number=0;//MathDG.random(2,10);
			//
			var scale:Number=MathDG.random(2,20)*5/100;
			var scaleSpeed:Number=-MathDG.random(1,4)/100;
			//
			var alpha:Number=100;
			var alphaSpeed:Number=0;//-MathDG.random(3,6);
			//发射
			Particle3DManager.Emit(linkName,world,
				initX,initY,initZ,
				vx,vy,vz,
				ax,ay,az,
				
				rotation,rotationSpeed,
			
				scale,scaleSpeed,
			
				alpha,alphaSpeed,
				
				life);
		}
	}
	//做爆炸的发射
	public static function StartBlast2(world:World,linkName:String,
		initX:Number,initY:Number,initZ:Number){
		T.p("Emit_BlastSparks");
		var count:Number=MathDG.random(20,30);
		for(var i=0;i<count;i++){
			//life
			var life:Number=MathDG.random(8,10);
			
			//速度和加速度
			var initSpeed:Number=MathDG.random(16,24);
			var acc:Number=MathDG.random(-3,-1);
			//两个角度
			var radA:Number=MathDG.random(0,360)*MathDG.DTR;//xoz平面内的角度
			var radB:Number=MathDG.random(0,90)*MathDG.DTR;//
			
			var vy:Number=Math.sin(radB)*initSpeed;
			var v_xoz:Number=Math.cos(radB)*initSpeed;
			var vx:Number=v_xoz*Math.sin(radA);
			var vz:Number=v_xoz*Math.cos(radA);
			
			var ay:Number=Math.sin(radB)*acc;
			var a_xoz:Number=Math.cos(radB)*acc;
			var ax:Number=a_xoz*Math.sin(radA);
			var az:Number=a_xoz*Math.cos(radA);
			
			//
			var rotation:Number=MathDG.random(0,360);
			var rotationSpeed:Number=0;//MathDG.random(2,10);
			//
			var scale:Number=MathDG.random(10,20)*5/100;
			var scaleSpeed:Number=-MathDG.random(1,4)/100;
			//
			var alpha:Number=100;
			var alphaSpeed:Number=-Math.floor(100/life);//-MathDG.random(3,6);
			//发射
			Particle3DManager.Emit(linkName,world,
				initX,initY,initZ,
				vx,vy,vz,
				ax,ay,az,
				
				rotation,rotationSpeed,
			
				scale,scaleSpeed,
			
				alpha,alphaSpeed,
				
				life);
		}
	}
	//掉血动画
	public static function DropBlood(world:World,linkName:String,
		dropBlood:Number,//掉血的数量
		x:Number,y:Number,z:Number,
		vy:Number,
		alpha:Number,alphaSpeed:Number
		){
			
		//发射
		var md:Model=	Particle3DManager.Emit(linkName,world,
				x,y,z,
				0,vy,0,
				0,0,0,
				
				0,0,
			
				1,0,
			
				alpha,alphaSpeed,
				
				Math.abs(Math.floor(alpha/alphaSpeed))+1//life比较长
				);
		//不使用缩放
		md.getVisu().bUseScale=false;
		//数字显示是第几真1,2,...,9,0
		var f:Number=dropBlood;
		md.getMovieClip().mc_digit.gotoAndStop(f);
	}
	
	//注意这个的坐标原点在Bottom,为了就是让烟在地面上，因为有缩放,烟的旋转在md.getMoveiClip().mc_r里做
	public static function EmitDust(world:World,linkName:String,
		x:Number,y:Number,z:Number){
	
		//
		var md:Model=Particle3DManager.Emit(
			linkName,world,
			
			x,y,z,
			0,0,0,
			0,0,0,
			
			0,0,
			
			MathDG.random(4,6)*10/100,0.05,
			
			100,-10,
			
			Math.floor(100/10)
		);
		//烟自己的旋转
		md.getMovieClip().mc_r._rotation=MathDG.random(0,360);
		
	}
	//注意这个的坐标原点在Bottom,为了就是让烟在地面上，因为有缩放,烟的旋转在md.getMoveiClip().mc_r里做
	public static function EmitSmoke(world:World,linkName:String,
		x:Number,y:Number,z:Number){
	
		//
		var md:Model=Particle3DManager.Emit(
			linkName,world,
			
			x,y,z,
			0,0,0,
			0,0,0,
			
			0,0,
			
			MathDG.random(4,6)*10/100,0.05,
			
			100,-10,
			
			Math.floor(100/10)
		);
		//烟自己的旋转
		md.getMovieClip().mc_r._rotation=MathDG.random(0,360);
		
	}
	//发射幻影
	public static function EmitPhantom(world:World,linkName:String,
		x:Number,y:Number,z:Number){
	
		//
		var md:Model=Particle3DManager.Emit(
			linkName,world,
			
			x,y,z,
			0,0,0,
			0,0,0,
			
			0,0,
			
			1,-0.05,
			
			100,-10,
			
			Math.floor(100/10)
		);
		//烟自己的旋转
		md.getMovieClip().mc_r._rotation=MathDG.random(0,360);
		
	}
	//*/
	/*
	//注意这个的坐标原点在Bottom,为了就是让烟在地面上，因为有缩放,烟的旋转在md.getMoveiClip().mc_r里做
	public static function EmitSmoke(linkName:String,
		x:Number,y:Number,z:Number):Model{
	
		//
		var md:Model=ParsM.Emit(
			linkName,
			
			x,y,z,
			0,0,0,
			0,0,0,
			
			0,0,
			
			MathDG.random(4,6)*10/100,0.05,
			
			1,-0.1,
			
			100/10
		);
		//烟自己的旋转
		md.v3d_r.y=MathDG.random(0,360);
		
		return md;
	}
	//模拟扬起的尘土，是抛物线形的
	//注意这个的坐标原点在Bottom,为了就是让烟在地面上，因为有缩放,烟的旋转在md.getMoveiClip().mc_r里做
	public static function EmitDust(linkName:String,
		x:Number,y:Number,z:Number){
	
		//
		var md:Model=ParsM.Emit(
			linkName,
			
			x,y,z,
			0,4,0,
			0,-1,0,
			
			0,0,
			
			MathDG.random(7,10)*10/100,-0.1,
			
			1,-0.05,
			
			MathDG.random(6, 8)
		);
		//烟自己的旋转
		md.v3d_r.y=MathDG.random(0,360);
		
		return md;
		
	}
	//做爆炸的发射
	public static function StartBlast2(world:World,linkName:String,
		initX:Number,initY:Number,initZ:Number){
		trace("StartBlast2",initX,initY,initZ);
		var count:Number=MathDG.random(20,30);
		for(var i:int=0;i<count;i++){
			//life
			var life:Number=MathDG.random(8,10);
			
			//速度和加速度
			var initSpeed:Number=MathDG.random(16,24);
			var acc:Number=MathDG.random(-3,-1);
			//两个角度
			var radA:Number=MathDG.random(0,360)*MathDG.DTR;//xoz平面内的角度
			var radB:Number=MathDG.random(0,90)*MathDG.DTR;//
			
			var vy:Number=Math.sin(radB)*initSpeed;
			var v_xoz:Number=Math.cos(radB)*initSpeed;
			var vx:Number=v_xoz*Math.sin(radA);
			var vz:Number=v_xoz*Math.cos(radA);
			
			var ay:Number=Math.sin(radB)*acc;
			var a_xoz:Number=Math.cos(radB)*acc;
			var ax:Number=a_xoz*Math.sin(radA);
			var az:Number=a_xoz*Math.cos(radA);
			
			//
			var rotation:Number=MathDG.random(0,360);
			var rotationSpeed:Number=0;//MathDG.random(2,10);
			//
			var scale:Number=MathDG.random(10,20)*5/100;
			var scaleSpeed:Number=-MathDG.random(1,4)/100;
			//
			var alpha:Number=1;
			var alphaSpeed:Number=-1/life;
			//发射
			var md:Model=ParsM.Emit(linkName,
				initX,initY,initZ,
				vx,vy,vz,
				ax,ay,az,
				
				rotation,rotationSpeed,
			
				scale,scaleSpeed,
			
				alpha,alphaSpeed,
				
				life);
			world.addChild(md);
		}
	}
	//坦克爆炸,碎片都被抛上了空中,原来的位置是ABH范围，是从那里爆炸出来的
	public static function BlastMesh3DV(md:Model){
		var F:Number=200;//爆炸的力量
		
		
		var world:World=md.getWorld();
		var A:Number=md.A;
		var B:Number=md.B;
		var H:Number=md.H;
		var R:Number=Math.max(A,Math.max(B, H));//ABH中最大的
		var count:int=MathDG.random(3,5);
		for(var i:int=0;i<count;i++){
			var size:Number=MathDG.random(R*(1/16),R*(4/16));
			
			var m:Number=size;//Math.pow(size, 3);//质量
			var vy:Number=F/m;
			//trace(i,size,m,vy);
			
			var md_chip:Model=Factory3D.CreateModel_TriChip(size,0x333333);//Factory3D.CreateModel_Cube(size);
			world.addChild(md_chip);
			
			
			
			var x:Number=md.v3d_p.x;
			var y:Number=md.v3d_p.y;
			var z:Number=md.v3d_p.z;
			
			
			
			
			var r:Number=MathDG.random(0,360);
			var rv:Number=MathDG.random(2,4)*5;
			
			var life:Number=(vy/-PosiM.G)*2;
				///////////////////
			//发射
			ParsM.Emit2(md_chip,
				x+MathDG.random(0,A)-A,y+MathDG.random(0,H),z+MathDG.random(0,B)-B,
				0,vy,0,
				0,PosiM.G,0,
				
				r,r,r,
				rv,rv,rv,
				0,0,0,
			
				1,1,1,
				0,0,0,
				0,0,0,
			
				1,0,//ALPHA
				
				life);
			//////////////////
			
			
		}
		
	}
	//
	//坦克爆炸,碎片都被抛上了空中,原来的位置是ABH范围，是从那里爆炸出来的,F是爆炸的力量
	//暂时是不能用的，这个效果不是很好
	public static function BlastGroup3DV(md_g:Group3D,F:Number=300){
		trace("BlastGroup3DV");
		var count:int=md_g.getChildCount();
		for(var i:int=0;i<count;i++){

			var md_chip:Model=md_g.getChildAt(i);;
			var m:Number=md_chip.R;//Math.pow(size, 3);//质量
			var vy:Number=F/m;
			trace(i,vy,m);
			trace(md_chip.v3d_p);
			trace(md_chip.v3d_r);
			var rv:Number=MathDG.random(2,4)*5;
			
			var A:Number=md_chip.A;
			var B:Number=md_chip.B;
			var H:Number=md_chip.H;
			
			var x:Number=md_chip.v3d_p.x;
			var y:Number=md_chip.v3d_p.y;
			var z:Number=md_chip.v3d_p.z;
			var life:Number=(vy/-PosiM.G)*2;
				///////////////////
			//发射
			ParsM.Emit2(md_chip,
				x,y,z,
				0,vy,0,
				0,PosiM.G,0,
				
				md_chip.v3d_r.x,md_chip.v3d_r.y,md_chip.v3d_r.z,
				rv,rv,rv,
				0,0,0,
			
				1,1,1,
				0,0,0,
				0,0,0,
			
				1,0,//ALPHA
				
				life);
			//////////////////
			
			
		}
	}
	//
	//喷射粒子
	public static function SpraySpark(world:World,
					linkName:String,
					initX:Number,initY:Number,initZ:Number,
					angleXOZ:Number,angleY:Number,angelRange:Number,
					speed:Number,speedRange:Number,
					count:int=5){
		trace("SpraySpark",initX,initY,initZ);
		
		for(var i:int=0;i<count;i++){
			//life
			var life:Number=MathDG.random(8,10);
			
			//速度和加速度
			var initSpeed:Number=speed+MathDG.random(0,speedRange);
			var acc:Number=-1;//MathDG.random(-3,-1);
			//两个角度
			var radA:Number=(angleXOZ+MathDG.random(0,angelRange*2)-angelRange)*MathDG.DTR;//xoz平面内的角度
			var radB:Number=(angleY+MathDG.random(0,angelRange*2)-angelRange)*MathDG.DTR;//
			
			var vy:Number=Math.sin(radB)*initSpeed;
			var v_xoz:Number=Math.cos(radB)*initSpeed;
			var vx:Number=v_xoz*Math.sin(radA);
			var vz:Number=v_xoz*Math.cos(radA);
			
			var ay:Number=0.5;//!!向上飘的加速度Math.sin(radB)*acc;
			var a_xoz:Number=Math.cos(radB)*acc;
			var ax:Number=a_xoz*Math.sin(radA);
			var az:Number=a_xoz*Math.cos(radA);
			
			//
			var rotation:Number=MathDG.random(0,360);
			var rotationSpeed:Number=0;//MathDG.random(2,10);
			//
			var scale:Number=MathDG.random(10,20)*5/100;
			var scaleSpeed:Number=MathDG.random(1,4)/100;
			//
			var alpha:Number=1;
			var alphaSpeed:Number=-1/life;
			//发射
			var md:Model=ParsM.Emit(linkName,
				initX,initY,initZ,
				vx,vy,vz,
				ax,ay,az,
				
				rotation,rotationSpeed,
			
				scale,scaleSpeed,
			
				alpha,alphaSpeed,
				
				life);
			world.addChild(md);
		}
	}
	//
	//*/
}//end of class
}